package com.sheng.leetcode.year2022.month11.day15;

import org.junit.Test;

import java.util.Arrays;

/**
 * @author liusheng
 * @date 2022/11/15
 *<p>
 * 1710. 卡车上的最大单元数<p>
 *<p>
 * 请你将一些箱子装在 一辆卡车 上。给你一个二维数组 boxTypes ，<p>
 * 其中 boxTypes[i] = [numberOfBoxesi, numberOfUnitsPerBoxi] ：<p>
 * numberOfBoxesi 是类型 i 的箱子的数量。<p>
 * numberOfUnitsPerBoxi 是类型 i 每个箱子可以装载的单元数量。<p>
 * 整数 truckSize 表示卡车上可以装载 箱子 的 最大数量 。<p>
 * 只要箱子数量不超过 truckSize ，你就可以选择任意箱子装到卡车上。<p>
 * 返回卡车可以装载 单元 的 最大 总数。<p>
 *<p>
 * 示例 1：<p>
 * 输入：boxTypes = [[1,3],[2,2],[3,1]], truckSize = 4<p>
 * 输出：8<p>
 * 解释：箱子的情况如下：<p>
 * - 1 个第一类的箱子，里面含 3 个单元。<p>
 * - 2 个第二类的箱子，每个里面含 2 个单元。<p>
 * - 3 个第三类的箱子，每个里面含 1 个单元。<p>
 * 可以选择第一类和第二类的所有箱子，以及第三类的一个箱子。<p>
 * 单元总数 = (1 * 3) + (2 * 2) + (1 * 1) = 8<p>
 *<p>
 * 示例 2：<p>
 * 输入：boxTypes = [[5,10],[2,5],[4,7],[3,9]], truckSize = 10<p>
 * 输出：91<p>
 *<p>
 * 提示：<p>
 * 1 <= boxTypes.length <= 1000<p>
 * 1 <= numberOfBoxesi, numberOfUnitsPerBoxi <= 1000<p>
 * 1 <= truckSize <= 10^6<p>
 */
public class LeetCode1710 {

    @Test
    public void test01() {
//        int[][] boxTypes = {{1,3},{2,2},{3,1}};
//        int truckSize = 4;
        int[][] boxTypes = {{5,10},{2,5},{4,7},{3,9}};
        int truckSize = 10;
        System.out.println(new Solution().maximumUnits(boxTypes, truckSize));
    }
}
class Solution {
    public int maximumUnits(int[][] boxTypes, int truckSize) {
        int ans = 0;
        // 排序按照二维数组的第二个元素进行，从大到小排序，相等时，按照第一个元素从大到小
        Arrays.sort(boxTypes, (o1, o2) -> o1[1] == o2[1] ? o2[0] - o1[0] : o2[1] - o1[1]);
        for (int[] boxType : boxTypes) {
            if (truckSize > 0) {
                if (truckSize >= boxType[0]) {
                    ans = ans + boxType[0] * boxType[1];
                    truckSize -= boxType[0];
                } else {
                    ans = ans + truckSize * boxType[1];
                    break;
                }
            } else {
                break;
            }
        }
        return ans;
    }
}
